<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <title>MSYS2 和 mintty 打造 Windows 下 Linux 工具体验 - Creaink - Build something for life</title>
  <meta name="renderer" content="webkit" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>

<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />

<meta name="theme-color" content="#f8f5ec" />
<meta name="msapplication-navbutton-color" content="#f8f5ec">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="#f8f5ec">


<meta name="author" content="Creaink" /><meta name="description" content="通过对 MSYS2 的一顿操作，可以获得在 Windows 下比较畅快的 Linux 工具的体验，体验到 Vim、Tmux、zsh、Git、MinGW-w64 等优秀的工具：
" /><meta name="keywords" content="Windows, MSYS2, mintty, shell, MinGW-w64, MinGW" />






<meta name="generator" content="Hugo 0.52 with even 4.0.0" />


<link rel="canonical" href="http://creaink.github.io/post/Computer/Windows/win-msys2/" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/manifest.json">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">


<link href="/dist/even.56003f67.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.1.20/dist/jquery.fancybox.min.css" integrity="sha256-7TyXnr2YU040zfSP+rEcz29ggW4j56/ujTPwjMzyqFY=" crossorigin="anonymous">


<meta property="og:title" content="MSYS2 和 mintty 打造 Windows 下 Linux 工具体验" />
<meta property="og:description" content="通过对 MSYS2 的一顿操作，可以获得在 Windows 下比较畅快的 Linux 工具的体验，体验到 Vim、Tmux、zsh、Git、MinGW-w64 等优秀的工具：

" />
<meta property="og:type" content="article" />
<meta property="og:url" content="http://creaink.github.io/post/Computer/Windows/win-msys2/" /><meta property="article:published_time" content="2019-01-12T16:42:33&#43;08:00"/>
<meta property="article:modified_time" content="2019-01-12T16:42:33&#43;08:00"/>

<meta itemprop="name" content="MSYS2 和 mintty 打造 Windows 下 Linux 工具体验">
<meta itemprop="description" content="通过对 MSYS2 的一顿操作，可以获得在 Windows 下比较畅快的 Linux 工具的体验，体验到 Vim、Tmux、zsh、Git、MinGW-w64 等优秀的工具：

">


<meta itemprop="datePublished" content="2019-01-12T16:42:33&#43;08:00" />
<meta itemprop="dateModified" content="2019-01-12T16:42:33&#43;08:00" />
<meta itemprop="wordCount" content="3944">



<meta itemprop="keywords" content="Windows,Shell,MinGW," />
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="MSYS2 和 mintty 打造 Windows 下 Linux 工具体验"/>
<meta name="twitter:description" content="通过对 MSYS2 的一顿操作，可以获得在 Windows 下比较畅快的 Linux 工具的体验，体验到 Vim、Tmux、zsh、Git、MinGW-w64 等优秀的工具：

"/>

<!--[if lte IE 9]>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/classlist/1.1.20170427/classList.min.js"></script>
<![endif]-->

<!--[if lt IE 9]>
  <script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
<![endif]-->

</head>
<body>
  <div id="mobile-navbar" class="mobile-navbar">
  <div class="mobile-header-logo">
    <a href="/" class="logo">Creaink</a>
  </div>
  <div class="mobile-navbar-icon">
    <span></span>
    <span></span>
    <span></span>
  </div>
</div>
<nav id="mobile-menu" class="mobile-menu slideout-menu">
  <ul class="mobile-menu-list">
    <a href="/">
        <li class="mobile-menu-item">Home</li>
      </a><a href="/post.html">
        <li class="mobile-menu-item">Archives</li>
      </a><a href="/tags.html">
        <li class="mobile-menu-item">Tags</li>
      </a><a href="/categories.html">
        <li class="mobile-menu-item">Categories</li>
      </a><a href="/links.html">
        <li class="mobile-menu-item">Links</li>
      </a><a href="/about.html">
        <li class="mobile-menu-item">About</li>
      </a>
  </ul>
</nav>
  <div class="container" id="mobile-panel">
    <header id="header" class="header">
        <div class="logo-wrapper">
  <a href="/" class="logo">Creaink</a>
</div>

<nav class="site-navbar">
  <ul id="menu" class="menu">
    <li class="menu-item">
        <a class="menu-item-link" href="/">Home</a>
      </li><li class="menu-item">
        <a class="menu-item-link" href="/post.html">Archives</a>
      </li><li class="menu-item">
        <a class="menu-item-link" href="/tags.html">Tags</a>
      </li><li class="menu-item">
        <a class="menu-item-link" href="/categories.html">Categories</a>
      </li><li class="menu-item">
        <a class="menu-item-link" href="/links.html">Links</a>
      </li><li class="menu-item">
        <a class="menu-item-link" href="/about.html">About</a>
      </li>
  </ul>
</nav>
    </header>

    <main id="main" class="main">
      <div class="content-wrapper">
        <div id="content" class="content">
          <article class="post">
    
    <header class="post-header">
      <h1 class="post-title">MSYS2 和 mintty 打造 Windows 下 Linux 工具体验</h1>

      <div class="post-meta">
        <span class="post-time">&nbsp;<i class="iconfont icon-calendar"></i> 2019-01-12 </span>
          <span class="more-meta"> <i class="iconfont icon-book"></i> 3944 words </span>
          <span class="more-meta"> <i class="iconfont icon-clock"></i> 8 mins read </span>
        
      </div>
    </header>

    <div class="post-toc" id="post-toc">
  <h2 class="post-toc-title">Contents</h2>
  <div class="post-toc-content always-active">
    <nav id="TableOfContents">
<ul>
<li>
<ul>
<li><a href="#一些概念">一些概念</a></li>
<li><a href="#使用-mintty">使用 mintty</a>
<ul>
<li><a href="#mintty-美化">mintty 美化</a></li>
</ul></li>
<li><a href="#cmder-conemu">cmder &amp; ConEmu</a></li>
<li><a href="#使用-git-bash">使用 Git bash</a></li>
<li><a href="#使用-msys2">使用 MSYS2</a>
<ul>
<li><a href="#安装和更新">安装和更新</a></li>
<li><a href="#msys2-改造">MSYS2 改造</a></li>
<li><a href="#知识点">知识点</a>
<ul>
<li><a href="#pacman">pacman</a></li>
<li><a href="#msys2-mingw32-64">MSYS2 MinGW32/64</a></li>
</ul></li>
<li><a href="#msys2-配置">MSYS2 配置</a></li>
<li><a href="#vscode-集成-zsh">VSCode 集成 zsh</a></li>
</ul></li>
<li><a href="#其他问题">其他问题</a></li>
<li><a href="#参考">参考</a></li>
</ul></li>
</ul>
</nav>
  </div>
</div>
    <div class="post-content">
      <p>通过对 MSYS2 的一顿操作，可以获得在 Windows 下比较畅快的 Linux 工具的体验，体验到 Vim、Tmux、zsh、Git、MinGW-w64 等优秀的工具：</p>

<p><img src="https://i.loli.net/2019/01/11/5c3860c8bfd9f.png" alt="最终效果图" /></p>

<p>Windows 下的桌面端程序丰富，但是对于一个程序猿来说，在某些犄角旮旯的需求场景下用 Linux 的命令行工具解决可能比 Windows 下 GUI 的鼠标点击来的更快，在熟悉了 Linux 命令行之后更加是离不开。某些 Windows 下的收费程序（如 XShell）还能在 Linux 下找到跟好且开源的替代品（OpenSSH）；而有些 Linux 下命令行工具（如 tmux）的极致体验在 Windows 下就很难得了。还好有 MSYS2 的存在，解决了 Windows 下 tmux、ssh、compiler 等众多命令行的痛点。WSL(Windows Subsystem for Linux) 结合 mintty 应该也能满足需求，有机会的话另做文章。</p>

<h2 id="一些概念">一些概念</h2>

<p>在进行操作之前有必要了解下下面的几个容易混淆的名称和概念：</p>

<ul>
<li><p><code>Cygwin</code>，利用 cygwin1.dll 将 POSIX 调用转换为 Windows 的 API 调用，利用模拟层以支持将 Linux 应用移植到 Windows 上。Cygwin 提供名为 apt-cyg 的包管理。</p></li>

<li><p><code>MinGW</code>，Minimalist GNU for Windows，MinGW 是用于进行 Windows 应用开发的 GNU 工具链，如可以在 VScode 中选用其作为 C/C++ 的开发工具链（也如 Code::blocks、eclipse 等），它的编译产物一般是原生 Windows 应用，MinGW 工具链也存在于 Linux、BSD 甚至 Cygwin 下。但是 MinGW 不能编译包含 MFC、WinSDK 的 Windows 应用。</p></li>

<li><p><code>MinGW-w64</code>，MinGW 的 64 位版本。</p></li>

<li><p><code>MSYS</code>，MinGW 仅仅是工具链，win 下的 cmd 使用起来不够方便，MSYS 是用于辅助 Windows 版 MinGW 进行命令行开发的配套软件包，提供了部分 Unix 工具以使得 MinGW 的工具使用起来方便一些。相比基于庞大的 Cygwin 下的 MinGW 会轻巧不少。</p></li>

<li><p><code>MSYS2</code>，MSYS 的第二代，有大量预编译的软件包，并且具有包管理器 pacman (ArchLinux)。</p></li>

<li><p><code>mintty</code>，<a href="https://zh.wikipedia.org/wiki/%E8%99%9A%E6%8B%9F%E7%BB%88%E7%AB%AF" target="_blank">终端虚拟机</a>，可以供 Cygwin、MSYS、MSYS2、WSL 使用，<a href="https://mintty.github.io/" target="_blank">GitHub</a>。</p></li>
</ul>

<p>以上的内容都可以在 <a href="https://github.com/Microsoft/Git-Credential-Manager-for-Windows/issues/500" target="_blank">Git-Credential-Manager-for-Windows</a>) 的大佬的讨论里看到。</p>

<h2 id="使用-mintty">使用 mintty</h2>

<p>win 下的 MSYS2 和 Cygwin 都是使用的 mintty，也可以使用 <code>cmder</code> 或者 <code>ConEmu</code> 连接，但是在 ConEmu 和 cmder 下使用 tmux 体验有问题，所以还是建议使用 mintty 为好。</p>

<p>mintty 的使用的 <a href="https://github.com/mintty/mintty/wiki/Tips" target="_blank">Tips</a>，可以自行研究下。</p>

<p>不过就使用来说了解下面的几个快捷键就可：</p>

<ul>
<li><code>ctrl/shift + ins</code> 复制/粘贴</li>
<li>在 tmux 的鼠标模式下，按下 shift 还是可以使用鼠标选择文字的</li>
<li><code>ctrl + plus/minus/zero</code> 放大、缩小、还原</li>
<li>拖拽资源管理器里的文件/文件夹到 mintty 可以得到其路径</li>
</ul>

<p>其他关于 mintty 的技巧可以在 <a href="https://github.com/mintty/mintty/wiki/Tips" target="_blank">Tips</a> 了解更多。</p>

<h3 id="mintty-美化">mintty 美化</h3>

<p>可以在 <a href="https://github.com/hsab/WSL-config/tree/master/mintty/themes" target="_blank">这里</a> 找到很多主题，下面给出了一个基于 onedark 主题和 <a href="https://github.com/ryanoasis/nerd-fonts" target="_blank">DejaVu</a> 字体（支持 Powerline) 的配置，修改 <code>~/.minttyrc</code> 为下面的内容之后重新打开 mintty 即可：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre class="chroma"><code class="language-txt" data-lang="txt"><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span></code></pre></td>
<td class="lntd">
<pre class="chroma"><code class="language-txt" data-lang="txt">Font=DejaVuSansMono NF
Transparency=low
FontHeight=10
Term=xterm-256color
Columns=110
Rows=35
Scrollbar=none
AllowBlinking=yes

ForegroundColour=171,178,191
BackgroundColour=30,33,39
CursorColour=97,175,239
BoldBlack=92,99,112
Black=92,99,112
BoldRed=224,108,117
Red=224,108,117
BoldGreen=152,195,121
Green=152,195,121
BoldYellow=209,154,102
Yellow=209,154,102
BoldBlue=97,175,239
Blue=97,175,239
BoldMagenta=198,120,221
Magenta=198,120,221
BoldCyan=86,182,194
Cyan=86,182,194
BoldWhite=171,178,191
White=171,178,191
BoldAsFont=yes</code></pre></td></tr></table>
</div>
</div>
<p>其他的配置也可以通过右键 mintty 窗口标题栏的 option 进行修改，也可以将主题文件保存到 <code>msys64/usr/share/mintty/themes</code> 目录下，这样在 option 里就可以修改了。</p>

<h2 id="cmder-conemu">cmder &amp; ConEmu</h2>

<p>这一部分自己可以探索，在使用 tmux + zsh 之后其实可以放弃这两个软件了，除非有使用 cmd 和 powershell 的需求。</p>

<h2 id="使用-git-bash">使用 Git bash</h2>

<p>在正式进入 MSYS2 的使用之间，可以先聊聊 Windows 下大家都会安装的工具 Git for Windows，一个基于 MSYS2 的 Git。下载安装就不在赘述，我的习惯一般是只将 git bash here 勾选上。</p>

<p>使用 Git bash 时候从窗口标题栏可以看出这是个基于 MinGW-w64 的项目，利用 Git 的源码 和 MinGW-w64 工具链编译的基于 windows 下的 git，为了提高使用幸福感 Git bash 的 shell 使用的是 MSYS2（安装目录下的 <code>usr/bin/mintty</code>)，当然将 git.exe 所在目录加在 windows 下的环境变量里之后在 cmd 和 powershell 下也是可以使用 git 命令的，但是其体验不及 git bash（如无：GCM）。</p>

<p>由于使用了 MSYS2，那么同时也会提供一些附属的命令，查看 git 安装目录下的 <code>usr/bin</code> 即可知道有哪些。</p>

<p><strong>改进 Git bash 体验</strong>，如果不想安装 MSYS2 但又想改进 git bash 的使用姿势，可以参照下面的步骤：</p>

<ol>
<li><p>使用 tmux，这个需要先安装下载 MSYS2 然后使用 pacman 安装 tmux ，之后将 <code>tmux.exe</code> 和 <code>msys-event-2-1-4.dll</code> 放在 <code>Git\usr\bin</code> 目录下，可直接使用以提取的文件 <a href="files/msys2-tmux-pkg-for-git.zip" target="_blank">msys2-tmux-pkg-for-git.zip</a></p></li>

<li><p>集成 vscode 终端，参考 MSYS2 的 vscode 终端集成，也就是将 zsh 换成 bash</p></li>
</ol>

<p>git for windows 是基于 MSYS2 和 MinGW 的一个项目，但是是基于修改过的 msys2-runtime，查看 <a href="https://github.com/git-for-windows/git/wiki" target="_blank">gfw wiki</a> 可能会了解更多。如果仅仅是轻度的命令行依赖，在安装 tmux 之后，git bash 应该就能够满足需求，但如果诉求更多的话，那么就要考虑 MSYS2 了。</p>

<h2 id="使用-msys2">使用 MSYS2</h2>

<p>下面进入正题，完全使用 MSYS2 可以在其上安装 git，MinGW-w64，OpenSSH，CMake 还有其他工具等，免得使用 git 装一个、使用 MinGW-w64 又装一个，这所以的功能其实都可以由 MSYS2 配合 pacman 来完成，OpenSSH + tmux 连什么 XShell 工具都可以省略掉了。</p>

<p>关于 msysgit 和 git for windows 的区别？在 <a href="https://github.com/msysgit/msysgit" target="_blank">msysgit</a> 可以看到。</p>

<h3 id="安装和更新">安装和更新</h3>

<ol>
<li><p>安装，在 <a href="https://www.msys2.org/" target="_blank">MSYS2 官网</a> 下载安装 MSYS2。</p></li>

<li><p>更新源，众所周知，使用 pacman 的默认源肯定是慢的一批，所以参考 <a href="https://lug.ustc.edu.cn/wiki/mirrors/help/msys2" target="_blank">中科大 MSYS2 源</a> 添加上国内源。</p></li>

<li><p>更新软件包，执行完下面的命令之后，需要手动关闭窗口，然后在 MSYS2 的安装目录下找到 autorebase.bat，双击运行之后再打开 Msys2。完之后可能需要再执行以下第二步骤，因为自定义的源可能再更新的时候被覆盖了</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre class="chroma"><code class="language-shell" data-lang="shell"><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre class="chroma"><code class="language-shell" data-lang="shell">$ pacman -Sy
$ pacman -Su</code></pre></td></tr></table>
</div>
</div></li>

<li><p>之后再次运行 <code>pacman -Su</code> 更新软件包</p></li>

<li><p>安装一些常见的包 <code>pacman -S git vim tmux zsh</code></p></li>

<li><p>参考 <a href="#mintty-美化">mintty 美化</a></p></li>

<li><p>在 windows 上配置环境变量 HOME 为 <code>C:\you-path\msys64\home\your-name</code>，增加这个环境变量的目的是为了让 git for windows 的 home 目录指向 MSYS2 的 home 目录；如果安装了 git for windows ，其 home 目录默认为 <code>%USERPROFILE%</code>，导致 git for windows 和 MSYS2 的 git 配置和 vim 等配置不能共享；如果在安装 MSYS2 之前已经安装 git for windows 需要使用将之前的 ssh 和 git 的配置拷贝到 MSYS2 的 home 目录下。</p></li>
</ol>

<h3 id="msys2-改造">MSYS2 改造</h3>

<ul>
<li><p>vim、tmux 的配置根据自己的喜好即可，vim 下的 <a href="https://github.com/Valloric/YouCompleteMe/wiki/Windows-Installation-Guide-for-Unix%E2%80%90like-Environments" target="_blank">YouCompleteMe</a></p></li>

<li><p>使用 <code>sh -c &quot;$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)&quot;</code> 安装 ohmyzsh，之后要想默认打开使用 zsh 需要做下面的几步：</p>

<ul>
<li>确保以后使用 <code>msys2.exe</code>，<code>mingw32.exe</code>，<code>mingw64.exe</code> 打开终端，而不是 bat。</li>
<li>修改 MSYS2 安装文件夹下的 <code>msys2.ini</code>，<code>mingw32.ini</code>，<code>mingw64.ini</code> 在其内加上 <code>SHELL=/usr/bin/zsh</code>。</li>
<li>但是在 tmux 里面还是会默认使用 bash，修改 <code>~/.tmux.conf</code> 添加 <code>set-option -g default-shell /usr/bin/zsh</code> 然后从 reload。</li>
</ul></li>

<li><p>如果想要继承 windows 的 PATH，修改 <code>msys2.ini</code> 等文件添加上 <code>MSYS2_PATH_TYPE=inherit</code></p></li>

<li><p>添加右键打开，可以尝试 <a href="https://github.com/njzhangyifei/msys2-mingw-shortcut-menus" target="_blank">msys2-mingw-shortcut-menus</a> ；实际使用中应该是开一个窗口使用 tmux 进行复用，利用鼠标拖拽到 mintty 窗口即可快速粘贴路径</p></li>

<li><p>安装 MinGW-w64 的 gcc 工具链，使用命令 <code>pacman -S mingw-w64-x86_64-toolchain</code>，需要使用 <code>mingw64.exe</code> 打开的 shell 里才会有工具链的命令。</p></li>

<li><p>可以将 git for windows 的环境变量去掉，然后将 <code>msys64\usr\bin</code> 目录添加到 windows 环境变量中，这样可以只使用 MSYS2 中的 git 了，使用之前需要修改的一个地方是需要使用命令行 <code>git config --global core.autocrlf true</code> 配置一下，原因是 git for windows 默认配置是 true ，即将 win 下的 crlf(carriage return, line feed) 转化为 lf 后存入版本库，但是 MSYS2 中的默认不是，所以需要配置之后使用。</p></li>

<li><p>也可以直接在 MSYS2 上安装 64 位的 git for windwows，需要参考 <a href="https://github.com/git-for-windows/git/wiki/Install-inside-MSYS2-proper" target="_blank">Install inside MSYS2 proper</a>，不过 gfw 在 zsh 下面好像有 compdef 的错误。</p></li>

<li><p>可以自行挂载常用 win 下的目录到 MSYS2 的 home 目录。</p></li>
</ul>

<h3 id="知识点">知识点</h3>

<h4 id="pacman">pacman</h4>

<p>包管理 pacman 有下列常用的参数</p>

<ul>
<li><code>-S</code> 同步软件，即下载</li>
<li><code>-Sl</code> 列出可用软件包</li>
<li><code>-R</code> 删除包</li>
</ul>

<h4 id="msys2-mingw32-64">MSYS2 MinGW32/64</h4>

<p>安装完 MSYS2 之后，开始菜单中会发现三个快捷方式：<code>MSYS2 MinGW 32-bit</code>、<code>MSYS2 MinGW 64-bit</code>、<code>MSYS2 MSYS</code>，右键快捷方式发现其执行都是 <code>msys2_shell.cmd</code> 文件，只是附件的参数不同如 <code>-mingw32</code>，<code>-mingw64</code>，<code>-msys</code></p>

<p>查看 <code>msys2_shell.cmd</code> 文件会发现传进来的参数会影响环境变量 MSYSTEM 的配置：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre class="chroma"><code class="language-bat" data-lang="bat"><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre class="chroma"><code class="language-bat" data-lang="bat"><span class="k">if</span> <span class="s2">&#34;x</span><span class="nv">%~1</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="s2">&#34;x-msys&#34;</span> <span class="k">shift</span><span class="p">&amp;</span> <span class="k">set</span> <span class="nv">MSYSTEM</span><span class="p">=</span>MSYS<span class="p">&amp;</span> <span class="k">goto</span> <span class="p">:</span><span class="nl">checkparams</span>
<span class="k">if</span> <span class="s2">&#34;x</span><span class="nv">%~1</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="s2">&#34;x-msys2&#34;</span> <span class="k">shift</span><span class="p">&amp;</span> <span class="k">set</span> <span class="nv">MSYSTEM</span><span class="p">=</span>MSYS<span class="p">&amp;</span> <span class="k">goto</span> <span class="p">:</span><span class="nl">checkparams</span>
<span class="k">if</span> <span class="s2">&#34;x</span><span class="nv">%~1</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="s2">&#34;x-mingw32&#34;</span> <span class="k">shift</span><span class="p">&amp;</span> <span class="k">set</span> <span class="nv">MSYSTEM</span><span class="p">=</span>MINGW32<span class="p">&amp;</span> <span class="k">goto</span> <span class="p">:</span><span class="nl">checkparams</span>
<span class="k">if</span> <span class="s2">&#34;x</span><span class="nv">%~1</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="s2">&#34;x-mingw64&#34;</span> <span class="k">shift</span><span class="p">&amp;</span> <span class="k">set</span> <span class="nv">MSYSTEM</span><span class="p">=</span>MINGW64<span class="p">&amp;</span> <span class="k">goto</span> <span class="p">:</span><span class="nl">checkparams</span></code></pre></td></tr></table>
</div>
</div>
<p>当然还可以使用其他的一些参数，让其设定为环境变量传递给 MSYS2 设置其特性。</p>

<p>也就是这三个的不同点也就是一个环境变量的不同，而这个环境变量最终会影响 PATH 的调用顺序，也就是 mingw32 优先使用 mingw32 下的工具，mingw64_shell.bat 优先使用 mingw64 下的工具，而 msys2 两个都不使用，只用自身 msys 的工具 (usr bin)。这么做的好处是当需要编译 32bit Target 的项目时使用 mingw32，64 bit 使用 mingw64，各套工具互不干扰。</p>

<h3 id="msys2-配置">MSYS2 配置</h3>

<p>在上面的改造之中也提及了开启 MSYS2 终端时候传递的环境变量配置，这些配置会影响最终的 SHELL 效果，可以在 <code>*.ini</code> 里配置相应 <code>*.exe</code> 的启动参数，也可以通过快捷方式传递给 <code>msys2_shell.cmd</code>：</p>

<ul>
<li><code>MSYSTEM</code> 也可以修改为 MSYS2</li>
<li><code>MSYS2_PATH_TYPE</code> 是否继承 windows 的 PATH 环境变量</li>
<li><code>CHERE_INVOKING</code> 是否使用当前登录目录为 HOME 目录；1 为否</li>
<li><code>SHELL</code> 指定 mintty 开启的终端</li>
</ul>

<p>部分环境变量最终起作用的原理在于 <code>/etc/profile</code> 脚本，可以自行实践。</p>

<h3 id="vscode-集成-zsh">VSCode 集成 zsh</h3>

<p>将 zsh 集成到 VSCode 的内置终端非常简单，一下是我的参考配置：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre class="chroma"><code class="language-json" data-lang="json"><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span></code></pre></td>
<td class="lntd">
<pre class="chroma"><code class="language-json" data-lang="json"><span class="err">//</span> <span class="err">新shell尝试</span>
<span class="s2">&#34;terminal.integrated.shell.windows&#34;</span><span class="err">:</span> <span class="s2">&#34;C:\\Application\\msys64\\usr\\bin\\zsh.exe&#34;</span><span class="err">,</span>
<span class="s2">&#34;terminal.integrated.shellArgs.windows&#34;</span><span class="err">:</span> <span class="p">[</span>
    <span class="s2">&#34;--login&#34;</span><span class="p">,</span>
<span class="p">]</span><span class="err">,</span>
<span class="s2">&#34;terminal.integrated.env.windows&#34;</span><span class="err">:</span> <span class="p">{</span>
    <span class="nt">&#34;CHERE_INVOKING&#34;</span><span class="p">:</span> <span class="s2">&#34;1&#34;</span><span class="p">,</span>
    <span class="nt">&#34;MSYSTEM&#34;</span><span class="p">:</span> <span class="s2">&#34;MINGW64&#34;</span><span class="p">,</span>
    <span class="nt">&#34;MSYS2_PATH_TYPE&#34;</span><span class="p">:</span> <span class="s2">&#34;inherit&#34;</span><span class="p">,</span>
    <span class="nt">&#34;VSCODE&#34;</span><span class="p">:</span> <span class="s2">&#34;1&#34;</span>
<span class="p">}</span><span class="err">,</span>
<span class="s2">&#34;terminal.integrated.cursorStyle&#34;</span><span class="err">:</span> <span class="s2">&#34;line&#34;</span><span class="err">,</span>
<span class="s2">&#34;terminal.integrated.fontFamily&#34;</span><span class="err">:</span> <span class="s2">&#34;DejaVuSansMono NF&#34;</span><span class="err">,</span></code></pre></td></tr></table>
</div>
</div>
<p>需要说明的是 <code>terminal.integrated.env.windows</code> 项，这里的配置可以根据个人需要设置，值得注意的是 <code>VSCODE</code> 环境变量是我自己定义的，原因是在 VSCode 终端内使用默认的 robbyrussell 主题，由于提示符其提示符箭头的问题，终端内光标会不正常，问题见<a href="https://github.com/Maximus5/ConEmu/issues/1106" target="_blank">a space between cursor and words</a>，我这里的解决方式是，复制修改一份 robbyrussell 的主题，将箭头换成 <code>&gt;</code> 符号，然后在 <code>~/.zshrc</code> 里加以判断：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre class="chroma"><code class="language-sh" data-lang="sh"><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre class="chroma"><code class="language-sh" data-lang="sh"><span class="k">if</span> <span class="o">[[</span> -z <span class="s2">&#34;</span><span class="si">${</span><span class="nv">VSCODE</span><span class="si">}</span><span class="s2">&#34;</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
    <span class="nv">ZSH_THEME</span><span class="o">=</span><span class="s2">&#34;robbyrussell&#34;</span>
<span class="k">else</span>
    <span class="nv">ZSH_THEME</span><span class="o">=</span><span class="s2">&#34;robbyrussell_fix&#34;</span>
<span class="k">fi</span></code></pre></td></tr></table>
</div>
</div>
<p>这样在 VSCode 里将环境变量 <code>VSCODE</code> 传入即可激活修改过的主题，当然如果你使用的主题没有问题就不需要这样做了。还有就是同 cmder/ConEmu 一样，在 VSCode 的集成终端内无法使用 tmux。</p>

<h2 id="其他问题">其他问题</h2>

<p><strong>修复 mintty 的使用 win 的 python 终端问题</strong>，这是因为因为宿主机上的 python 使用的是 <strong>native Windows API for command-line user interaction</strong>，也就是涉及到 win 下的关于终端输入的命令在 msys2 下都会无法进入，还好有解决方法。</p>

<p>安装 <code>pacman -S winpty</code> 作为 mintty 代理，处理 python 之外其他有问题的也可使用如 nodejs、MySQL 等。之后就可以使用如 <code>winpty python</code> 来使用，也可以全局使用 winpty 去 wraper，但是会使得 tmux 无法使用。所以最好的方式在 bashrc/zshrc 里添加 alias 即可：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre class="chroma"><code class="language-sh" data-lang="sh"><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre class="chroma"><code class="language-sh" data-lang="sh"><span class="nb">alias</span> <span class="nv">mysql</span><span class="o">=</span><span class="s2">&#34;winpty mysql&#34;</span>
<span class="nb">alias</span> <span class="nv">node</span><span class="o">=</span><span class="s2">&#34;winpty node&#34;</span>
<span class="nb">alias</span> <span class="nv">python</span><span class="o">=</span><span class="s2">&#34;winpty python&#34;</span>
<span class="nb">alias</span> <span class="nv">ipython</span><span class="o">=</span><span class="s2">&#34;winpty ipython&#34;</span>
<span class="nb">alias</span> <span class="nv">psql</span><span class="o">=</span><span class="s2">&#34;winpty psql&#34;</span>
<span class="nb">alias</span> redis-cli<span class="o">=</span><span class="s2">&#34;winpty redis-cli&#34;</span></code></pre></td></tr></table>
</div>
</div>
<p>另外在 msys2 下要想使用 python 虚拟环境，就得使用 <code>source venv/Scripts/activate</code> 的形式了。</p>

<p><strong>watch 命令缺失</strong>，该命令需要单独安装：<code>pacman -S procps-ng</code>，同理一些其他的命令行的缺失可以在搜索引擎里以 <code>MSYS2 xxx</code> 的形式得到解答。</p>

<h2 id="参考">参考</h2>

<ul>
<li><a href="https://github.com/Microsoft/Git-Credential-Manager-for-Windows/issues/500#issuecomment-344739371" target="_blank">GCM</a></li>
<li><a href="https://www.zhihu.com/question/22137175" target="_blank">Cygwin 和 MinGW 的区别与联系是怎样的？</a></li>
<li><a href="https://medium.com/@borekb/zsh-via-msys2-on-windows-3964a943b1ce" target="_blank">Zsh on Windows via MSYS2</a></li>
<li><a href="https://blog.pjsen.eu/?p=440" target="_blank">How to run Tmux in GIT Bash on Windows</a></li>
<li><a href="http://dantvt.is-programmer.com/posts/63161.html" target="_blank">MSYS2 + MinGW-w64 + Git + gVim 环境配置</a></li>
</ul>
    </div>

    <div class="post-copyright">
  <p class="copyright-item">
    <span class="item-title">Author</span>
    <span class="item-content"><a href="https://creaink.github.com" class="theme-link">Creaink</a></span>
  </p>
  <p class="copyright-item">
    <span class="item-title">LastMod</span>
    <span class="item-content">2019-01-12</span>
  </p>
  
  <p class="copyright-item">
    <span class="item-title">License</span>
    <span class="item-content"><a rel="license noopener" href="https://creativecommons.org/licenses/by-nc-nd/4.0/" target="_blank">CC BY-NC-ND 4.0</a></span>
  </p>
</div><footer class="post-footer">
      <div class="post-tags">
        <div style="margin-bottom:5px">
          <i class="iconfont icon-folder-open"></i>
            <a href="/categories/Tools/">Tools</a>
            </div>
        <div>
          <i class="iconfont icon-label"></i>
            <a href="/tags/Windows/">Windows</a>
            <a href="/tags/Shell/">Shell</a>
            <a href="/tags/MinGW/">MinGW</a>
            </div>
      </div>

      
      <nav class="post-nav">
        
        <a class="next" href="/post/Computer/Linux/Linux-namespace/">
            <span class="next-text nav-default">Linux Namespace 技术与 Docker 原理浅析</span>
            <span class="next-text nav-mobile">Next</span>
            <i class="iconfont icon-right"></i>
          </a>
      </nav>
    </footer>
  </article>
        </div>
        <div id="lv-container" data-id="city" data-uid="MTAyMC80MjAzOS8xODU4Ng">
    <script type="text/javascript">
      (function(d, s) {
        var j, e = d.getElementsByTagName(s)[0];

        if (typeof LivereTower === 'function') { return; }

        j = d.createElement(s);
        j.src = 'https://cdn-city.livere.com/js/embed.dist.js';
        j.async = true;

        e.parentNode.insertBefore(j, e);
      })(document, 'script');
    </script>
    <noscript>Please enable JavaScript to view the comments powered by <a href="https://livere.com/">LiveRe.</a></noscript>
    </div>

      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="social-links">
      <a href="mailto:gcreaink@gmail.com" class="iconfont icon-email" title="email"></a>
      <a href="https://github.com/creaink" class="iconfont icon-github" title="github"></a>
  <a href="http://creaink.github.io/index.xml" type="application/rss+xml" class="iconfont icon-rss" title="rss"></a>
</div>

<div class="copyright">
  <span class="power-by">
    Powered by <a class="hexo-link" href="https://gohugo.io">Hugo</a>
  </span>
  <span class="division">|</span>
  <span class="theme-info">
    Theme - 
    <a class="theme-link" href="https://github.com/olOwOlo/hugo-theme-even">Even</a>
  </span>

  

  <span class="copyright-year">
    &copy; 
    2019
    <span class="heart">
      <i class="iconfont icon-heart"></i>
    </span>
    <span class="author"><a href="https://creaink.github.com" class="theme-link">Creaink</a></span>
  </span>
</div>
    </footer>

    <div class="back-to-top" id="back-to-top">
      <i class="iconfont icon-up"></i>
    </div>
  </div>
  
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>
  <script src="https://cdn.jsdelivr.net/npm/slideout@1.0.1/dist/slideout.min.js" integrity="sha256-t+zJ/g8/KXIJMjSVQdnibt4dlaDxc9zXr/9oNPeWqdg=" crossorigin="anonymous"></script>
  <script src="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.1.20/dist/jquery.fancybox.min.js" integrity="sha256-XVLffZaxoWfGUEbdzuLi7pwaUJv1cecsQJQqGLe7axY=" crossorigin="anonymous"></script>
<script type="text/javascript" src="/dist/even.26188efa.min.js"></script>


<script type="application/javascript">
var doNotTrack = false;
if (!doNotTrack) {
	window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
	ga('create', 'UA-131846852-1', 'auto');
	ga('set', 'anonymizeIp', true);
	ga('send', 'pageview');
}
</script>
<script async src='https://www.google-analytics.com/analytics.js'></script>







</body>
</html>
